package com.ktjy.config;

import com.ktjy.cond.ConditionOnPropertyEnable;
import com.ktjy.entity.SysRole;
import com.ktjy.entity.SysUser;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

/**
 * 使用javaconfig的方式来替换xml配置的方式来配置。  创建对象以及依赖注入
 * @version v1.0
 * @Author JieGe
 * @Create 2024-12-12 - 9:24
 */
// @PropertySource用于读取外部的配置文件
// <context:property-placeholder location="classpath:user.properties"/>
@PropertySource(value = "classpath:user.properties") // 读取user.properties配置文件
// 将普通类变成配置类
@Configuration // 当前类是一个配置类， 可以用于替换xml配置文件
public class JavaConfig {

    @Value("${user.realName}") // 读取user.properties配置文件中key为user.realName所对应的值
    private String realName;

    @Value("${user.account}")
    private String account;

    @Value("${user.password}")
    private String password;

    @Value("${user.sex}")
    private int sex;

    @Bean // <bean id="user" class="com.ktjy.entity.SysUser"/>
    // @Autowire @Qualifier("managerRole")
    // @Qualifier("adminRole") 按名称到Spring容器中查找依赖对象，找到后并赋值给role参数
    // @Qualifier("adminRole")
    public SysUser user(@Qualifier("adminRole")SysRole role) {
        SysUser user = new SysUser();  // 创建SysUser对象
        user.setRealName(realName);  // <property name="realName" value="张三"/>
        user.setAccount(account);
        user.setSex(sex);
        user.setPassword(password);
        // 为private SysRole sysRole; 对象属性赋值
        user.setSysRole(role);  // user.setRole(role);
        return user;
    }

    // 下面再创建两个角色对象
    @Bean
    // 使用ConditionOnPropertyEnable注解类作为条件判断
    @Conditional(ConditionOnPropertyEnable.OnEnableCondition.class)
    // 2、使用@ConditionOnPropertyEnable进行条件判断，当admin.enable所对应的值为true时。
    // 下面方法就可以创建bean组件，并注册到Spring容器中。
    @ConditionOnPropertyEnable(enableProperty = "admin.enable")
    // admin.enable如果true
    // @Primary // 如果有多个类型相同的对象，默认/优先使用下面对象
    public SysRole adminRole() { // 控制使用注解标识的方法是否能创建bean组件。如果条件为false当前方法就不能创建bean组件，即当前方法的@Bean注解是失效
        SysRole role = new SysRole();
        role.setId(1);
        role.setRoleName("管理员");
        role.setCode("ADMIN");
        return role;
    }
    // 再创建第二个角色对象
    @Bean
    @Conditional(ConditionOnPropertyEnable.OnEnableCondition.class)
    @ConditionOnPropertyEnable(enableProperty = "manager.enable")
    public SysRole managerRole() {
        SysRole role = new SysRole();
        role.setRoleName("店长");
        role.setCode("MANAGER");
        role.setId(2);
        return role;
    }



}
